{{tag>messagerie courriel postfix MTA serveur BROUILLON}}

====== Installer Postfix avec le serveur de messagerie du réseau local ou sur internet ======
Pour communiquer directement avec un serveur de messagerie internet ou du [[https://fr.wikipedia.org/wiki/R%C3%A9seau_local|LAN]]. C'est la configuration «système satellite».

Pour plus d'informations sur la messagerie lire [[:comment_fonctionne_le_courriel_sous_linux|Comment fonctionne le courriel sous Linux ?]], et sur les principes du serveur Postfix lire [[:comment_configurer_sa_distribution_de_courriels_systemes_mta|Comment configurer sa distribution de courriels systèmes MTA avec Postfix ?]]

===== Installation du serveur de messagerie Postfix =====
[[:tutoriel:comment_installer_un_paquet|Installez les paquets]] du serveur de messagerie **[[apt>postfix|postfix]]**.
Choisir «pas de configuration» si l'installation demande de paramétrer le serveur de messagerie.

{{ :doc:02_pasdeconfiguration.png?nolink&600 |}}

Pour la partie sécurité du serveur [[:tutoriel:comment_installer_un_paquet|installez les paquets]] **[[apt>libsasl2-modules,libauthen-sasl-cyrus-perl, |libsasl2-modules libauthen-sasl-cyrus-perl]]**.

Installer le client [[mutt|Mutt]] de messagerie MUA **[[apt>mutt|mutt]]** (les clients MUA de mailutils et de bsd-mailx ne supportent que le format mbox pour la gestion locale, vous pouvez aussi utiliser [[https://neomutt.org|Neomutt]] avec plus de fonctionnalités en remplacement de Mutt **[[apt>neomutt|Neomutt]]**).




===== Définir le gestionnaire de messagerie =====
**Vous devez définir qui va avoir la supervision de la messagerie**. Donc si l'utilisateur root est le superviseur de la messagerie, ou si c'est un utilisateur du système (serveur ou desktop Linux). Le fichier **/etc/aliases** (''kate /etc/aliases'') est à paramétrer comme suit.

Avec l'utilisateur directement gestionnaire de messagerie :
<file>postmaster:    utilisateur</file>

Avec l'utilisateur gestionnaire de la machine Linux (relais postmater à l'utilisateur root) :
<file>postmaster:    root
root:    utilisateur</file>

Valider dans Postfix la configuration :
<code bash>sudo postalias /etc/aliases</code>

<note warning>Par défaut, lors de la configuration du serveur de messagerie, celui-ci sera positionné avec l'utilisateur root</note>

===== Configuration de Postfix avec un serveur du réseau local ou sur Internet =====

Pour configurer postfix, tapez :
<code bash>sudo dpkg-reconfigure postfix</code>

{{ :doc:02_systemesatellite.png?nolink&600 |}}
Saisissez Système satellite

{{ :doc:03_nomducourriel_perso-fr.png?nolink&600 |}}
Remplacez perso.fr par votre nom de domaine de machine

{{ :doc:12_reseauxrelais_smtp-fai-fr.png?nolink&600 |}}
Indiquez ici le nom du serveur de relaie smtp de votre réseau local ou d'internet (ici cas avec Gmail)

{{ :doc:04_adminserveur_internet.png?nolink&600 |}}
Le compte de messagerie internet de l'administrateur de la machine que vous avez défini ([[:comment_configurer_sa_distribution_de_courriels_systemes_mta#definir_le_gestionnaire_de_messagerie|ne pas oublier d'avoir fait la configuration du gestionnaire avant]]) doit être saisie ici.

{{ :doc:05_domainesmessagerie_defaut.png?nolink&600 |}}
Laissez ce champ vide

{{ :doc:06_synchrofileattente.png?nolink&600 |}}

{{ :doc:07_reseauxdistribution_local.png?nolink&600 |}}

{{ :doc:08_taillebal.png?nolink&600 |}}

{{ :doc:09_extadresse.png?nolink&600 |}}

{{ :doc:10_protocoles.png?nolink&600 |}}

===== Configurer le client mail MUA système =====
Testez la lecture de la boîte aux lettres :
<code bash>mutt</code>

Si vous avez un message du genre :
<code>/home/utidisateur/Mail n'existe pas. Le créer ? ([oui]/non):</code>
C'est que votre client mail est mal configuré.

Tapez : <code>n</code> puis pour quitter Mutt <code>q</code>

==== Configuration du client de courriels ====

Éditer le fichier .muttrc dans votre dossier /home/utilisateur (''kate ~/.muttrc'')
Et ajouter ou modifier ces lignes :
<file># Configuration de base
set realname="{Prénom NOM}"
set header_cache=~/.mutt/cache/headers
set certificate_file=~/.mutt/certificates
set message_cachedir=~/.mutt/cache/bodies
set beep
set use_from = yes

# Boite de réception
set spoolfile=~/.local/share/courriels/arrivées/
# Boite aux lettres de Mutt
set folder=~/.local/share/courriels

# Autres dossiers
set postponed=+brouillons
set record=+envoyés

# Encodage à utiliser
set charset=utf-8
set send_charset=utf-8
# Format de la date à afficher avant les citations lors d'une réponse
set date_format="%A %d %B %Y à %I:%M:%S%p"
set index_format="%4C %Z %{%b %d} %-15.15F (%4l) %s"
set fast_reply
set include=yes

# Configuration SMTP
set sendmail="/usr/sbin/sendmail"
</file>

===== Emplacement des boîtes aux lettres des utilisateurs du système =====
Nous remarquons que le «configurateur» de Postfix n'a pas demandé de préciser où les boîtes aux lettres des utilisateurs sont situées. 

La commande de la file d'attente :
<code bash>postconf queue_directory</code>
renvoie
<code>queue_directory = /var/spool/postfix</code>

La commande de boîtes postales :
<code bash>postconf mail_spool_directory</code>
renvoie
<code>mail_spool_directory = /var/mail</code>

Si on passe la commande de boîtes aux lettres utilisateurs :
<code bash>postconf home_mailbox</code>
Nous avons :
<code>home_mailbox =</code>
Nous voyons alors que les boîtes aux lettres des utilisateurs sont des boîtes postales et se situent dans /var/mail/utilisateur.

Il nous faudra donc éditer le fichier /etc/postfix/main.cf (''kate /etc/postfix/main.cf'') et ajouter la variable **home_mailbox** pour vos utilisateurs.

Par exemple :
<file># au format maildir
home_mailbox = .local/share/courriels/arrivées/</file>
ou passer la commande dans un terminal :
<code bash>sudo postconf -e home_mailbox=.local/share/courriels/arrivées/</code>
afin que le courriel soit directement distribué dans la boîte aux lettres locale de l'utilisateur.

Pour valider la configuration dans Postfix, tapez :
<code bash>systemctl restart postfix</code>

===== Bloquer le port 25 SMTP standard =====
==== Test de la connexion sur le port 25 ====
Déjà testons que le port 25 est ouvert.
Pour cela tapez la commande :
<code bash>telnet localhost 25</code>

Ce qui affiche
<code>Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 Ma-Machine ESMTP Postfix (Ubuntu)</code>

Tapez :
<code>HELO Ma-Machine</code>
retourne
<code>250 Ma-Machine</code>

Puis saisissez l'identifiant d'un compte local :
<code>MAIL FROM: utilisateur</code>
retourne
<code>250 2.1.0 Ok</code>

Saisissez le destinataire :
<code>RCPT TO: utilisateur@localhost</code>
retourne
<code>250 2.1.5 Ok</code>

Saisissez :
<code>DATA</code>
retourne
<code>354 End data with <CR><LF>.<CR><LF></code>

Et enfin vous pouvez saisir votre courriel :
<code>From: utilisateur
To: utilisateur
Subject: Test de message sur port 25
Ceci est un test d'envoie sur port 25
Merci de votre coopération
.</code>
retourne
<code>250 2.0.0 Ok: queued as 9E77AA02321</code>

Pour quitter tapez :
<code>QUIT</code>
retourne
<code>221 2.0.0 Bye
Connection closed by foreign host.</code>

Vous avez expédié un courriels local :-)

==== Blocage du port 25 ====
Modifier le fichier master.cf (''kate /etc/postfix/master.cf'')
<file>#smtp      inet  n       -       y       -       -       smtpd</file>

Redémarrage de Postfix pour valider les changements :
<code bash>systemctl restart postfix</code>

==== Test du verrouillage du port 25 ====
Pour cela taper :
<code bash>telnet localhost 25</code>
retourne
<code>Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused</code>

===== Mettre en place de la connexion TLS pour votre trafic SMTP =====
Par défaut le configurateur configure TLS comme ci-dessus :
<file># TLS paramètres du serveur smtpd de Postfix
smtpd_tls_security_level=may
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination

# TLS paramètres du client smtp de Postfix
smtp_tls_security_level=may
smtp_tls_CApath=/etc/ssl/certs
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
</file>

==== Configuration d'un trafic TLS pur ====
Pour valider le transport [[https://fr.wikipedia.org/wiki/Transport_Layer_Security|TLS]] il faut modifier le fichier main.cf (''kate /etc/postfix/main.cf'') comme suit :
<file># TLS pour le serveur smtpd de Postfix
# Utilise le générateur de nombres aléatoires de Linux
tls_random_source = dev:/dev/urandom
# Active le protocole de cryptage TLS
smtpd_use_tls = yes
# N'autorise que les connections TLS
smtpd_tls_auth_only = yes
# Niveau de sécurité dans la négociation du protocole
smtpd_tls_security_level = may
# Les clefs du cryptage
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/certs/ssl-cert-snakeoil.key

# TLS pour le client
# Active le protocole de cryptage TLS
smtp_use_tls = yes
# Niveau de sécurité dans la négociation du protocole
smtp_tls_security_level = may
# Les clefs du cryptage
smtp_tls_CApath = /etc/ssl/certs
# Répertoire de cache pour la communication
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache</file>

==== Autoriser les connections TLS ====
Pour cela il faut modifier le fichier master.cf (''kate /etc/postfix/master.cf'')

Modifier le fichier comme ci-dessous :
<file>submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
</file>

Redémarrer Postfix :
<code bash>systemctl restart postfix</code>

==== Vérifier le blocage des connexions non TLS ====
Tester la connexion telnet :
<code bash>telnet localhost 587</code>
retourne                                
<code>Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 Ma-Machine ESMTP (Courriels)</code>

Taper :
<code>ehlo Ma-Machine</code>
retourne
<code>250-Ma-Machine
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250-SMTPUTF8
250 CHUNKING</code>

Taper :
<code>MAIL FROM: utilisateur</code>
retourne
<code>530 5.7.0 Must issue a STARTTLS command first</code>

Taper :
<code>quit</code>
retourne
<code>221 2.0.0 Bye
Connection closed by foreign host.</code>

==== Vérifier les connexions TLS ====
Pour vous connecter en TLS :
<code bash>openssl s_client -starttls smtp -connect localhost:587</code>
retourne
<code>CONNECTED(00000003)
…
    Start Time: 1598437512
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no
    Max Early Data: 0
---
read R BLOCK</code>

Tapez :
<code>ehlo Ma-Machine</code>
retourne
<code>250-Ma-Machine
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250-SMTPUTF8
250 CHUNKING</code>

Tapez :
<code>MAIL FROM: utilisateur</code>
retourne
<code>250 2.1.0 Ok</code>

Tapez :
<code>QUIT</code>
retourne
<code>221 2.0.0 Bye
Connection closed by foreign host.</code>
Vos échanges de courriels sont maintenant cryptés lors du transport en SMTP. 
===== Mettre en place l'authentification SASL =====
Pour vous connecter sur votre serveur distant relaie avec SASL il vous faut disposer d'un compte et d'un mot de passe.
=== Exemple de mot de passe SASL Gmail ===
Pour un identifiant SASL avec Gmail
== Création du mot de passe applicatif ==
{{ :doc:1_accesconfigcompte.png?nolink |}}

Cliquez sur {{:doc:2_gerercomptegoogle.png?nolink|}}

{{ :doc:3_menuinformationscompte.png?nolink |}}

Cliquez sur {{:doc:4_securite.png?nolink|}}

{{ :doc:5_connexionagoogle.png?nolink |}}

Cliquez sur {{:doc:6_motdepasseapplications.png?nolink|}}

{{ :doc:7_fenetremotdepasseapplications.png?nolink |}}

Cliquez sur **Sélectionnez un application** pour afficher le menu  {{:doc:8_selectionapplication.png?nolink|}}

Saisissez le nom Postfix de votre serveur de messagerie pour Google {{:doc:9_saisienomserveurpostfix.png?nolink|}}

Cliquez sur {{:doc:10_generer.png?nolink|}}

Notez le mot de passe générez {{:doc:11_motdepasseapplication.png?nolink|}}

{{ :doc:12_resultat.png?nolink |}}
Vous avez créé votre mot de passe sécurité Google pour votre application Postfix.
==== Configuration des identifiants du serveur ====
Éditez le fichier /etc/postfix/sasl/sasl_passwd (''kate /etc/postfix/sasl/sasl_passwd'') :
<file>[smtp.fm.fr]:587    mon_compte_gmail:mdp_applicatif_google</file>

Passez la commande pour valider le mot de passe avec Postfix :
<code bash>sudo postmap /etc/postfix/sasl_passwd</code>

=== Exemple avec Gmail ===
<file>[smtp.gmail.com]:587    utilisateur@gmail.com:ygvpyhldoiqujhth</file>

==== Configuration de Postfix ====
Modifiez /etc/postfix/main.cf (''kate /etc/postfix/main.cf''):
<file># Les interfaces réseau par lesquelles le système de messagerie reçoit les messages.
inet_interfaces = loopback-only
# La machine par défaut où livrer le courrier au départ lorsqu'il n'y a aucune destination locale d'arrivée (mydestination).
relayhost = [smtp.fm.fr]:587
# Active l'authentification SASL
smtp_sasl_auth_enable = yes
# Désactive l'authentification anonyme
smtp_sasl_security_options = noanonymous
# Location de l'indentifiant SASL
smtp_sasl_password_maps = hash:/etc/postfix/sasl/sasl_passwd</file>

=== Exemple avec Gmail ===
Modifier en plus de la configuration ci-dessus :
<file># La machine par défaut où livrer le courrier au départ lorsqu'il n'y a aucune destination locale d'arrivée (mydestination).
relayhost = [smtp.gmail.com]:587
# Pour corriger des erreurs d'authentification SASL avec GMAIL
smtp_sasl_mechanism_filter = plain
# Niveau de sécurité dans la négociation du protocole
smtp_tls_security_level = encrypt
# Location du certificat CA
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt</file>

Pour valider la configuration dans Postfix, tapez :
<code bash>systemctl restart postfix</code>

==== Correction sur l'expéditeur ====
À ce stade, si on redémarre le service Postfix, l'envoie de messages fonctionnent. 

Mais nous allons obtenir un message d'erreur sur l'expéditeur dans notre client de messagerie MUA à la réception du message.
{{ ::adresseexpincorrecte.png?nolink&600 |}}

Il faut, pour éviter cela, substituer le nom d'expéditeur avec le nom de l'adresse de messagerie du serveur de messagerie pour lequel on envoie le courriel.

=== Substitution des comptes locaux avec l'adresse du compte de connexion du fournisseur de messagerie ===
Éditez le fichier generic (''kate /etc/postfix/generic'') et modifiez le comme suivant :
<file>utilisateur@mon_nom_machine             username@mon_fm.fr
utilisateur@mondomainemessagerie.fr     username@mon_fm.fr 
root@mondomainemessagerie.fr            admin@mon_fm.fr
sudoer@mondomainemessagerie.fr          admin@mon_fm.fr</file>

== Exemple avec Gmail ==
<file>utilisateur@mon_nom_machine             username@gmail.com
utilisateur@localhost                   username@gmail.com
utilisateur@mondomainemessagerie.fr     username@gmail.com 
root@mondomainemessagerie.fr            username@gmail.com
sudoer@mondomainemessagerie.fr          username@gmail.com</file>

=== Validez pour Postfix les substitutions ===
<code bash>sudo postmap /etc/postfix/generic</code>

Ajoutez dans main.cf (''kate /etc/postfix/main.cf'') :
<file>smtp_generic_maps = hash:/etc/postfix/generic</file>

Redémarrer Postfix :
<code bash>systemctl restart postfix</code>

==== Débogage en cas de problèmes ====
=== Vérifier l'autentification au serveur SMTP de Gmail ===
Creer un Hash (code crypté de connexion) pour votre identifiant Gmail et votre mot de passe applicatif.
<code bash>python3 -c 'import sys; from base64 import b64encode; print(b64encode(bytes(f"mon_compte_gmail:mdp_applicatif_google", encoding="ascii")).decode("ascii"))'</code>
Soit pour notre exemple :
<code bash>python3 -c 'import sys; from base64 import b64encode; print(b64encode(bytes(f"utilisateur@gmail.com:ygvpyhldoiqujhth", encoding="ascii")).decode("ascii"))'</code>

ou en perl:
<code bash>perl -MMIME::Base64 -le 'print encode_base64("utilisateur\@gmail.com:ygvpyhldoiqujhth");'</code>

Ce qui donne en sortie :
<code>dXPpbGlzYXRldXJAZ21haWwuY29tOnlndnB5aGxkb2lxdWpodGg=</code>

Pour vérifier qu'il n'y a pas d'erreurs :
<code bash>python3 -c 'import sys; from base64 import b64decode; print(b64decode("dXPpbGlzYXRldXJAZ21haWwuY29tOnlndnB5aGxkb2lxdWpodGg=").decode("ascii"))'</code>

ou en perl
<code bash>perl -MMIME::Base64 -le 'print decode_base64("dXPpbGlzYXRldXJAZ21haWwuY29tOnlndnB5aGxkb2lxdWpodGg=");'</code>

Pour vous connecter avec cet identifiant crypté :
<code bash>openssl s_client -starttls smtp -connect smtp.gmail.com:587</code>

Puis saisissez : 
<code>ehlo domain
250-localpart.domain.part
250-PIPELINING
250-SIZE 31457280
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN</code>

Maintenant c'est le code de Hash de l'identifiant mot de passe applicatif Google qu'il faut saisir :
<code>AUTH PLAIN dXPpbGlzYXRldXJAZ21haWwuY29tOnlndnB5aGxkb2lxdWpodGg=</code>

Vérifiez alors que vous avez la ligne :
<code>235 2.7.0 Authentication successful</code>
